#将之前封装的MyMath类中的实例方法改为静态方法, 体会两者的区别.
'''
实例方法：先声明一个实例用于继承父类，再通过实例调用父类的方法
静态方法：通过@staticmethod装饰器，可以直接调用类方法
'''
class MyMath:
    #实例方法
    def add_shili(self, a ,b):
        return a + b
    #静态方法
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def sub(a, b):
        return a - b

    @staticmethod
    def mul(a, b):
        return a * b

    @staticmethod
    def div(a, b):
        return a / b

    @staticmethod
    def pow(a, b):
        return a ** b

    @staticmethod
    def root(a, b):
        return a ** (1/b)

test = MyMath()
print('实例方法', test.add_shili(1, 2))
print('静态方法', test.add(1, 2))
print('静态方法', test.sub(1, 2))
print('静态方法', test.mul(1, 2))
print('静态方法', test.div(1, 2))
print('静态方法', test.pow(1, 2))
print('静态方法', test.root(1, 2))
print('------')

#为上节课自定义类添加以下功能
'''
一：添加类属性
二：添加类私有属性
三：添加类方法或者类的私有属性
四：在__init__方法中初始化实例属性
五：在__init__方法中绑定私有实例属性
六：在自定义类中实现__str__, 自定义输出格式
'''
class lunch():

    # 一：添加类属性
    Usedfor = '可饱腹'
    other = '美味'

    # 二：添加类私有属性,不希望外部更改,只作用于类内部,通过类._类名__变量名来访问私有属性
    __ChineseFood = '中餐'

    # 三：添加类方法或者类的私有属性
    # 实验发现，当类方法名（不）为__new__时，创建实例时（不）会自动调用类方法
    @classmethod
    def __new__(cls, *args, **kwargs):
        print('这是一个类方法')
        return super().__new__(cls)
    # 类方法可以通过  实例名.类名.私有属性名  调用类的私有属性
    def new_1(cls):
        return lunch.__ChineseFood

    #四：在__init__方法中初始化实例属性
    #五：在__init__方法中绑定私有实例属性，实例的自有属性
    def __init__(self, special):
        self.special = '我的特点是：'+special

a1 = lunch('0')
print(a1.new_1())
print('------')

ChineseFood_lunch = lunch("好吃")
print('中餐,' + ChineseFood_lunch.special)
print('--------------------------------------')

ChineseFood_lunch = lunch('other')
ChineseFood_lunch.other = '中餐.other'
Sweet_lunch = lunch('other')
Sweet_lunch.other = '甜品.other'
print(ChineseFood_lunch.other)
print(Sweet_lunch.other)
print('--------------------------------------')

# 六：在自定义类中实现__str__, 自定义输出格式
class a(list):
    def __str__(self):
        print()
        return f'长度为：{len(self)}'
test = a(['1', '2', '3', '4'])
print(test)